#ifndef CLIONQT5WORK_IMAGELABEL_H
#define CLIONQT5WORK_IMAGELABEL_H
// Qt 基础类
#include <QLabel>               // 用于显示图像
#include <QPixmap>              // 存储图像数据
#include <QMouseEvent>          // 鼠标事件处理
#include <QContextMenuEvent>    // 右键菜单事件
#include <QPaintEvent>          // 绘图事件
#include <QPoint>               // 坐标点
#include <vector>               // C++ 标准容器 vector

// ImageLabel 类继承自 QLabel，用于支持图像显示、点选标注、多边形绘制、矩形选框、右键菜单等功能
class ImageLabel : public QLabel {
Q_OBJECT  // Qt 宏：支持信号与槽机制

public:
    explicit ImageLabel(QWidget *parent = nullptr); // 构造函数

    // 图像设置与变换
    void setOriginalPixmap(const QPixmap &pixmap);     //
    void rotateImage(int angle);                       // 对当前图像进行旋转（用于增强）
    void clearAll();                                   // 清除所有点、多边形与绘制状态

    // 点数据操作
    const std::vector<QPoint>& getPoints() const;      // 获取用户标注点
    // 获取矩形框的起止点
    QPoint getRectStartPoint() const;
    QPoint getRectEndPoint() const;
    void setMappedRect(const QPoint& start, const QPoint& end); // 绘制映射到图2上的矩形框

    // 获得isDrawingRect的状态
    bool getDranwingReaction();


signals:
    void pointsUpdated();  // 用户完成标注后发出的信号（可用于同步或更新 UI）

protected:
    // 鼠标事件处理
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;

    // 上下文菜单事件（右键）
    void contextMenuEvent(QContextMenuEvent *event) override;

    // 绘图事件（显示点、多边形、矩形等）
    void paintEvent(QPaintEvent *event) override;

private:
    // 原始与缩放图像（双图支持）
    QPixmap originalPixmap;
    QPixmap scaledPixmap;

    // 点集与状态标志
    std::vector<QPoint> points;         // 用户标注点集
    bool closed = false;                // 是否闭合多边形
    bool isRectMode = false;            // 是否处于矩形绘制模式
    bool isDrawingRect = false;         // 是否正在绘制矩形

    // 矩形绘制的起止点
    QPoint rectStartPoint;
    QPoint rectEndPoint;

    QPoint mappedRectStart, mappedRectEnd; // 添加此行: 存储映射到图2的矩形
    bool showMappedRect = false; // 添加此行: 控制是否显示映射矩形

    // 映射后的点集合（例如 SIFT 映射结果）
    std::vector<QPoint> mappedPolygon;
    bool showMappedPolygon = true;// 添加此行: 控制是否显示映射后的多边形

    // 坐标转换（控件 <-> 图像）
    QPoint mapToImage(const QPoint& widgetPos) const;   // 控件坐标 → 图像坐标
    QPoint mapToWidget(const QPoint& imgPt) const;      // 图像坐标 → 控件坐标
};






#endif // CLIONQT5WORK_IMAGELABEL_H
